package com.cowmooed.utils;

import com.cowmooed.exception.GlobalExceptionHandler;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
import java.util.regex.Pattern;

/**
 * 图像验证工具类
 * 用于验证图像格式、大小、分辨率和URL地址是否符合要求
 */
public class ImageValidationUtil {

    // 支持的图像格式集合
    private static final Set<String> SUPPORTED_FORMATS = new HashSet<>(Arrays.asList("PNG", "JPEG", "JPG", "BMP"));
    
    // 最大文件大小 (40MB)
    private static final long MAX_FILE_SIZE = 40 * 1024 * 1024;
    
    // 最小宽度和高度 (32像素)
    private static final int MIN_WIDTH = 32;
    private static final int MIN_HEIGHT = 32;
    
    // 最大宽度和高度 (10000像素)
    private static final int MAX_WIDTH = 10000;
    private static final int MAX_HEIGHT = 10000;
    
    // 中文字符正则表达式
    private static final Pattern CHINESE_CHAR_PATTERN = Pattern.compile("[\\u4e00-\\u9fa5]");

    /**
     * 验证图像文件是否符合要求
     * @param file 待验证的图像文件
     * @throws IOException 图像读取异常
     */
    public static void validateImage(MultipartFile file) throws IOException {
        // 验证文件是否为空
        if (file == null || file.isEmpty()) {
            throw new GlobalExceptionHandler.BusinessException("请上传有效的图像文件");
        }
        
        // 验证文件大小
        if (file.getSize() > MAX_FILE_SIZE) {
            throw new GlobalExceptionHandler.BusinessException("图像大小不能超过40MB");
        }
        
        // 验证文件格式
        String contentType = file.getContentType();
        if (contentType == null || !contentType.startsWith("image/")) {
            throw new GlobalExceptionHandler.BusinessException("请上传有效的图像文件");
        }
        
        // 获取文件扩展名并验证格式
        String originalFilename = file.getOriginalFilename();
        if (originalFilename == null || !originalFilename.contains(".")) {
            throw new GlobalExceptionHandler.BusinessException("图像文件格式不正确");
        }
        
        String extension = originalFilename.substring(originalFilename.lastIndexOf(".") + 1).toUpperCase();
        if (!SUPPORTED_FORMATS.contains(extension)) {
            throw new GlobalExceptionHandler.BusinessException("仅支持PNG、JPEG、JPG、BMP格式的图像");
        }
        
        // 验证图像分辨率
        BufferedImage image = ImageIO.read(file.getInputStream());
        validateImageDimensions(image);
    }
    
    /**
     * 验证图像文件是否符合要求
     * @param file 待验证的图像文件
     * @throws IOException 图像读取异常
     */
    public static void validateImage(File file) throws IOException {
        // 验证文件是否为空
        if (file == null || !file.exists() || !file.isFile()) {
            throw new GlobalExceptionHandler.BusinessException("请上传有效的图像文件");
        }
        
        // 验证文件大小
        if (file.length() > MAX_FILE_SIZE) {
            throw new GlobalExceptionHandler.BusinessException("图像大小不能超过40MB");
        }
        
        // 获取文件扩展名并验证格式
        String fileName = file.getName();
        if (fileName == null || !fileName.contains(".")) {
            throw new GlobalExceptionHandler.BusinessException("图像文件格式不正确");
        }
        
        String extension = fileName.substring(fileName.lastIndexOf(".") + 1).toUpperCase();
        if (!SUPPORTED_FORMATS.contains(extension)) {
            throw new GlobalExceptionHandler.BusinessException("仅支持PNG、JPEG、JPG、BMP格式的图像");
        }
        
        // 验证图像分辨率
        BufferedImage image = ImageIO.read(file);
        validateImageDimensions(image);
    }
    
    /**
     * 验证图像尺寸
     * @param image 待验证的图像
     */
    private static void validateImageDimensions(BufferedImage image) {
        if (image == null) {
            throw new GlobalExceptionHandler.BusinessException("无法读取图像内容");
        }
        
        int width = image.getWidth();
        int height = image.getHeight();
        
        if (width < MIN_WIDTH || height < MIN_HEIGHT) {
            throw new GlobalExceptionHandler.BusinessException("图像分辨率不能小于32×32像素");
        }
        
        if (width > MAX_WIDTH || height > MAX_HEIGHT) {
            throw new GlobalExceptionHandler.BusinessException("图像分辨率不能大于10000×10000像素");
        }
    }
    
    /**
     * 验证URL地址是否包含中文字符
     * @param url 待验证的URL地址
     */
    public static void validateUrl(String url) {
        if (url == null || url.isEmpty()) {
            return;
        }
        
        if (CHINESE_CHAR_PATTERN.matcher(url).find()) {
            throw new GlobalExceptionHandler.BusinessException("URL地址中不能包含中文字符");
        }
    }
}